#include<stdio.h>//Practica
#include<stdlib.h>
#include "cadena.h"
void destruirCadena(TCadena c)
{
	if(c!=NULL){
		free(c->cad1);free(c->cad2);free(c);}
	else
	{
		printf("No se pudo reservar la memoria 'destruirCadena'\n");
		exit(1);
	}
}
TCadena crearCadena(char cad1[],char cad2[])
{
	TCadena c=NULL;
	c=(TCadena)malloc(sizeof(Cadena));
	if(c==NULL)
	{
		printf("No se pudo reservar la memoria 'crearCadena'\n");
		exit(1);
	}
	c->cad1=(char*)malloc((elementosCadena(cad1))*sizeof(char));  //23
	c->cad2=(char*)malloc((elementosCadena(cad2))*sizeof(char));
	copiarCadena(cad1,c->cad1);
	copiarCadena(cad2,c->cad2);
	return c;
}
void copiarCadena(char cad1[],char cad2[])
{
	int k;
	for(k=0;*(cad1+k)!='\0';k++)
		*(cad2+k)=*(cad1+k);
	*(cad2+k)='\0';
}
int elementosCadena(char cad[])
{
	int k;
	for(k=0;*(cad+k)!='\0';k++);
	return k;
}
int compararCadena(TCadena c)
{
	int k;
	if(c!=NULL)
	{
		for(k=0;*(c->cad1+k)!='\0' && *(c->cad2+k)!='\0';k++) 	//se compara cade elemento de la cadeana 1 con los elementos
		{							//correspondientes de la cadena 2
			if(*(c->cad1+k)!=*(c->cad2+k))
				return 0;
		}
		if(*(c->cad1+k)==*(c->cad2+k))				//compara el último elemento de la cadeana, el caracter nulo '\0',
			return 1;					//para comprobar que son iguales
		else
			return 0;
	}
	else
	{
		printf("no se pudo reservar la memoria 'compararCadena'\n");
		exit(1);
	}
}
TCadena concatenarCadena(TCadena c,short opcion)
{
	int tam,i,k,x,aux=0;
	if(c!=NULL)
	{
		tam=elementosCadena(c->cad1) + elementosCadena(c->cad2) - 1;
		printf("tam: %d\n",tam);
		switch(opcion)
		{
			case 1:
				i=elementosCadena(c->cad1);
				printf("i: %d\n",i);
				c->cad1=(char*)realloc(c->cad1,tam*sizeof(char));	//redimensionamos el vector de caracteres
				if(c->cad1==NULL)
				{
					printf("ERROR: 'concatenarCadena'\n");exit(1);
				}
				for(k=i;*(c->cad2+aux)!='\0';k++)
				{							//se copian los caracteres
					*(c->cad1+k)=*(c->cad2+aux);
					aux++;
				}
				*(c->cad1+k)='\0';					//se copia el caracter nulo al final del vector
				break;
			case 2:
				i=elementosCadena(c->cad2);
				c->cad2=(char*)realloc(c->cad2,tam*sizeof(char));	//redimensionamos el vector de caracteres
				for(k=i;*(c->cad1+aux)!='\0';k++)
				{
					*(c->cad2+k)=*(c->cad1+aux);			//se pasan los caracteres
					aux++;
				}
				*(c->cad2+k)='\0';					//se copia el caracter nulo
				break;
			case 3:								//en "caso 3:" se copia la cadena 2 a la cadena 1
				i=elementosCadena(c->cad1);				//y también viceversa, la cadena 1 a la cadena 2
				c->cad1=(char*)realloc(c->cad1,tam*sizeof(char));
				for(k=i;*(c->cad2+aux)!='\0';k++)
				{
					*(c->cad1+k)=*(c->cad2+aux);
					aux++;
				}
				*(c->cad1+k)='\0';
				x=elementosCadena(c->cad2);
				c->cad2=(char*)realloc(c->cad2,tam*sizeof(char));
				aux=0;
				for(k=x;*(c->cad1+aux)!='\0';k++)
				{
					*(c->cad2+k)=*(c->cad1+aux);
					aux++;
				}
				*(c->cad2+aux)='\0';
				break;
			default:
				return NULL;break;					//en caso de que se esté pasando un número errone como parámetro
		}									//este retorna "NULL"
		return c;
	}
	else
	{
		printf("Memoria insuficiente\n");exit(1);
	}
}		//114
void imprimirCadena(TCadena c,short opcion)
{
	if(c!=NULL)
	{
		switch(opcion)
		{
			case 1:
				printf("Cadena 1: %s\n",c->cad1);break;
			case 2:
				printf("Cadena 2: %s\n",c->cad2);break;
			case 3:
				printf("Cadena 1: %s\n",c->cad1);
				printf("Cadena 2: %s\n",c->cad2);break;
			default:
				printf("El sugundo parámetro no es válido 'imprimirCadena'\n");break;
		}
	}
	else
	{
		printf("no se pudo reservar la memoria 'imprimirCadena'\n");
		exit(1);
	}
}

